package logic.operation;

import gui.MyTC;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

import javax.swing.JProgressBar;
import javax.swing.Timer;

import org.apache.log4j.Logger;

import logic.UnsupportedProtocol;
import logic.file.IDirectory;
import logic.file.IFile;
import logic.operation.AbstractTransferOperation.TimerAction;

public class PasteOperation extends AbstractTransferOperation {
	
	static Logger logger = Logger.getLogger(PasteOperation.class);
	//TODO ta klasa ma rozszerzać standardową klasę i files ma być odiedziczone



//	public PasteOperation(IDirectory destination, IOperationObserver observer) {
//		super(destination, observer);
//		// TODO Auto-generated constructor stub
//	}
//	
	//dla D&D
	public PasteOperation(List<IFile> files, IDirectory destination, IOperationObserver observer) {
		super(files, destination, observer);
		//this.files = files;
	}
	
	public PasteOperation() {}

	@Override
	public void execute() throws IOException, UnsupportedProtocol {
		
		timerAction = new TimerAction();
		
		//TODO do funkcji zarządzającej notyfikowaniem
		timer = new Timer(STANDARD_INTERVAL_FOR_TIMER, timerAction);
		timer.start();
		notifyObservers(0.0, "");
		logger.info("pasting from Clipboard" + destination);
		//if (files == null) {		//!D&D, really BAD DESIGN, błędne ew. przerobić d&d tak by także była wywoływane operacja kopiowania ustawiająca schowek
			//TODO files przecież też mogą być ustawiane z zewnątrz i przez to klasa Transfer może wywodzić się z AbstractFileOperation
			
		//}
		
		files = MyTC.getClipboard().getFiles();
		
		calcTotalSize();
		
		logger.info("total Size:" + totalSize);
		logger.debug("FILES TO PASTE:" + files);
		for(IFile file : files) {
			//ta metoda nie ma większego sensu, przerobić na callbacka z copyTo
			addCurrentFileBytes(file);
			//TODO do tej metody przekazanie obiektu przechowującego postęp Timer z operacji będzie sprawdzał ten obiekt 
			//a copyTo będzie modyfikował ten obiekt w zależności od postępu tylko add
			//raczej to musi być obiekt bo nie ma wskaźników
			//IFile też powienien udostępniać informację o postępie operacji kopiowania
			file.copyTo(destination.getPath(), byteCounter);			
		}
		logger.debug("Byte counter state:" + byteCounter.getCurrentVal());
		//TODO notyfikowanie powinno raczej się odbywać co jakis czas dyktowany przez zdarzenia Timera
		notifyObservers(100.0, "");
		timer.stop();
		finishedNotifyObservers();
		
	}

	@Override
	public void cancel() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void run() {
		try {
			execute();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	//TODO po redesignie (getClipboard na zewnątrz) i wszytskie operacje mają się tworzyć w momencie gdy faktycznie są potrzebne Actiony trzymają na stałe tylko typ operacji przypisanej do danej akcji 
	//ponadto to się powtarza w MyTC też - wywalić do jakiego Helpera ze staticiem
	protected void calcTotalSize() throws UnsupportedProtocol {
		int sum = 0;
		for (IFile file : files) {
			if (file instanceof IDirectory) {
				sum += ( (IDirectory) file ).calcDirSize(false);
				//TODO wywołanie polimorficzne do rozważenia
			} else {
				sum += file.getSize();
			}
		}
		totalSize = sum;
	}
	
	
	private void addCurrentFileBytes(IFile file) throws UnsupportedProtocol {
		long currentSize = 0;
		
		if (file instanceof IDirectory) {
			currentSize = ( (IDirectory) file ).calcDirSize(false);
		}
		else {
			currentSize = file.getSize();
		}
		logger.info(currentSize);
	}

	@Override
	public String getName() {
		return "Copying";			//nazwa dla końcowego użytkownika do monitów
	}
	
	//timer co pewien czas wyciąga ByteCountera postęp
	
	

}
